package com.tedu.API.list;
import org.junit.Test;

import java.util.*;
/**
 * Collection集合下，子集合【叫队列】
 * 包位置：java.util
 * Queue   队列      单端队列
 * Deque   队列      双端队列   Deque接口--继承--Queue接口
 * 作用：保存数据，有序存储和处理，
 * 功能：用于数据缓冲或者多线程协调工作
 *
 * 队列实现类：
 * LinkedList：双向链表
 */
public class QueueAPI {
    //Queue     队列     单端队列
    @Test
    public void testQueue(){
        //创建队列--多态--LinkedList
      Queue<String> queue=new LinkedList<>();
        /**
         * offer() ---add()一样
         * 作用：入队操作，对尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("冬眠");
        queue.offer("我的滑板鞋");
        queue.offer("体面");
        System.out.println("Queue队列："+queue);
        /**
         * poll()
         * 作用：出队操作，获取队首元素，并且删除队列中队首
         * peek()
         * 作用：出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll();queue.poll(); //删除队首元素
        System.out.println("Queue队列："+queue);
        String str=queue.peek();
        System.out.println("队首元素："+str);
        System.out.println("Queue队列："+queue);
        /**
         * 需求：1.遍历队列---用while--只遍历一次队列【队列元素消失】
         *    提示：while 条件：拿到队列中总长度  size()>0
         *
         */
//        while(queue.size()>0){ //true：队列总数>0    队列中有元素---遍历
//             str=queue.poll();//获取队首，删除队列中队首
//            System.out.println("获取队列元素:"+str);
//        }
//        System.out.println("Queue队列元素："+queue);
        /**
         *   需求：2.遍历队列--用增强for---队列元素继续保存，元素不消失
         *          提示：for 条件：E e  数组泛型/集合泛型: 数组引用/集合引用
         *
         */
        for(String i:queue){
            System.out.println("队列元素："+i);
        }
        System.out.println("Queue队列元素"+queue);
    }
    //Deque    队列      双端队列---继承---单端队列
    @Test
    public void testDeque(){
        //创建Deque  双端队列  方法基本一致，部分方法不一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("任贤齐");deque.offer("王菲");
        deque.offer("毛阿敏");deque.offer("那英");
        System.out.println("双端队列："+deque);
        //offerFirst()   队首添加元素
        //offerLast()    队尾添加元素
        deque.offerFirst("蔡徐坤");  deque.offerLast("薛之谦");
        System.out.println("双端队列[收尾添加元素]："+deque);
        //getFirst()  获取队首
        //getLast()   获取队尾    【与 单端：peek类似】
        System.out.println("获取队列中队首："+deque.getFirst());
        System.out.println("获取队列队尾："+deque.getLast());
        //pollFirst()   获取队首，删除队列中队首  【与单端：poll类似】
        //peekLast()    获取队尾，删除队列中队尾
        String xue=deque.pollLast();  //删除"薛之谦"元素   队列--队尾
        System.out.println("队尾元素："+xue);
        System.out.println("双端队列"+deque);
    }
    /**
     * 栈结构：业务中如果有后退【撤销】情况使用
     * 双端队列支持栈结构---提供想要的方法实现栈结构
     */
    @Test
    public void testStack(){
        //创建双端队列--支持栈结构
        Deque<String> stack=new LinkedList<>();
        /**
         * push() Deque 独有的方法--支持栈结构
         * push() ----offer--add：Collection接口 【添加】
         * 作用：【添加：往栈压入一个元素】  压栈操作
         */
        stack.push("夯大力");stack.push("恶搞之家");
        stack.push("喜洋洋");stack.push("魔方大厦");
        System.out.println("栈结构："+stack);
        /**
         * pop()  出栈一个尾元素 --pollLast类似【拿先入后出，最后一个压栈元素】
         */
        String last=stack.pop();
        System.out.println("出栈尾元素:"+last);
        System.out.println("栈结构："+stack);
        //面试题：pop、poll、peek的使用区别？
        /**
         * 作业：1.描述上面区别
         * pop：会移除并返回栈顶元素
         * pull：主要用于队列，从队列头部或双端队列的一端移除并返回元素。
         * peek：可以用于栈和队列，返回栈顶元素但不移除它，对于队列，返回队列头部元素但不移除它。
         *      2.遍历栈结构---while---元素出站，队列元素需要清空
         *      3.遍历栈结构---增强for--元素遍历成功，队列元素不变
         */
//         while(stack.size()>0){
//            String str= stack.pop();
//             System.out.println("遍历："+str);
//         }
//        System.out.println("清空后的栈"+stack);
        for(String i:stack){
            System.out.println("遍历："+i);
        }
    }
}
